import { getCookie } from 'common/js/util';
// CONNECTING：值为0，表示正在连接。
// OPEN：值为1，表示连接成功，可以通信了。
// CLOSING：值为2，表示连接正在关闭。
// CLOSED：值为3，表示连接已经关闭，或者打开连接失败。
let websock = null;
let messageCallback = null;
let errorCallback = null;
let wsUri = '';
let lockReconnect = false; // 连接失败不进行重连
let maxReconnect = 5; // 最大重连次数，若连接失败
/** 心跳 */
const heartCheck = {
  timeout: 60 * 1000,
  timer: null,
  serverTimer: null,
  reset() {
    this.timer && clearTimeout(this.timer);
    this.serverTimer && clearTimeout(this.serverTimer);
    // return this;
  },
  start(ws) {
    this.reset();
    this.timer = setTimeout(() => {
      // console.log('发送心跳,后端收到后，返回一个心跳消息')
      // onmessage拿到返回的心跳就说明连接正常
      // ws.send(JSON.stringify({ heart: 1 }));
      ws.send('ping');
      this.serverTimer = setTimeout(() => {
      // 如果超过一定时间还没响应(响应后触发重置)，说明后端断开了
      ws.close();
      }, this.timeout);
    }, this.timeout);
  }
};

// let tryTime = 0;

// 接收ws后端返回的数据
// function websocketonmessage (e) {
//   messageCallback(JSON.parse(e.data));
// }

function initWebSocket() {
  try {
    console.log('init websocket');
    if ('WebSocket' in window) {
      // console.log(websock);
      if (websock != null) {
        console.log('websock.readyState:' + websock.readyState);
        console.log('websock.close:' + websock.readyState);
      }
      if (websock == null || websock.readyState > 1) {
        console.log('[初始化websocket] 。。。');
        // natapp 映射的域名，很难连接
        websock = new WebSocket(wsUri);
        // if (websock == null) {
        //   alert('与服务器的连接失败，请联系管理员清理缓存');
        //   websocketclose(this);
        // }
      }
    } else {
      console.log('您的浏览器不支持websocket');
    }
    websock.onopen = websocketonopen;
    websock.onerror = websocketonerror;
    websock.onmessage = websocketonmessage;
    websock.onclose = websocketclose;
  } catch (e) {
    console.log('[初始化websocket] 异常消息：');
    console.log(e);
  }
}

// 重新连接
function reconnect() {
  console.log('尝试重连', maxReconnect);
  if (lockReconnect || maxReconnect <= 0) {
    return;
  }
  lockReconnect = true;
  maxReconnect--;
  setTimeout(() => {
    initWebSocket();
    lockReconnect = false;
  }, 10 * 1000);
}
// 建立连接
function websocketonopen() {
  heartCheck.start(websock); // 心跳检测重置
  console.log('WebSocket连接成功', new Date().toUTCString());
  // websocketsend(); // 这里不可以发送哈
}

function websocketonerror(e) {
  console.log('WebSocket连接发生错误', e);
  // errorCallback(e);
  reconnect();
}
function websocketonmessage(e) {
  // 心跳检测重置
  heartCheck.start(websock);  // 拿到任何消息都说明当前连接是正确的
  console.log('WebSocket收到消息：' + e.data);
  if (e.data !== 'pong') {
    // messageCallback(JSON.parse(e.data));
    messageCallback(e.data);
  }
}
function websocketclose(e) {
  // console.log('connection closed (' + (e && e.code) + ')');
  console.log('WebSocket连接关闭，', new Date().toUTCString());
  if (e && e.code !== 1000) {
    console.log('ws连接异常，非正常关闭');
    setTimeout(() => {
      reconnect();
    }, 600);
    // errorCallback();
  }
}
/**
 * 发起websocket连接，传输数据
 * @param {Object} agentData 需要向后台传递的参数数据
 */
function websocketsend(agentData) {
  // messageCallback(JSON.parse(agentData));
  // 若是ws开启状态
  // TODO: agentData == undefined 不发送
  try {
    heartCheck.reset();
    // if (websock != null) {
    //   if (websock.readyState === websock.OPEN) {
    //     websock.send(JSON.stringify(agentData));
    //   } else if (websock.readyState === websock.CONNECTING) {
    //     console.log('WebSocket发送，状态正在启动中，code=', websock.readyState);
    //     setTimeout(function () {
    //       websocketsend(agentData);
    //     }, 1000);
    //   } else {
    //     console.log('WebSocket发送，状态已关闭，重新建立连接，code=', websock.readyState);
    //     initWebSocket();
    //     setTimeout(function () {
    //       websocketsend(agentData);
    //     }, 500);
    //   }
    // } else {
    //   console.log('WebSocket发送，对象为空，重新建立连接');
    //   initWebSocket();
    //   setTimeout(function () {
    //     websocketsend(agentData);
    //   }, 500);
    // }
    if (websock == null) {
      initWebSocket();
      setTimeout(() => {
        websocketsend(agentData);
      }, 500);
    }
    if (websock.readyState === websock.OPEN) {
      websock.send(JSON.stringify(agentData));
    } else if (websock.readyState === websock.CONNECTING) { // 若是 正在开启状态，则等待300毫秒
        // 很多时候，300毫秒都不足以开启,可能是域名问题--------------------error
        setTimeout(function () {
          websock.send(JSON.stringify(agentData));
        }, 300);
    } else { // 若未开启 ，则等待500毫秒
        initWebSocket();
        setTimeout(function () {
          websock.send(JSON.stringify(agentData));
        }, 500); // 加延迟是为了尽量让ws连接状态变为OPEN
    }
  } catch (e) {
    errorCallback(e);
  }
}
/**
 * 发起websocket请求函数
 * url ws连接地址 分离出去了
 * @param {Object} agentData 传给后台的参数
 * @param {function} successCallback 接收到ws数据，对数据进行处理的回调函数
 * @param {function} errCallback ws连接错误的回调函数
 */
export function sendWebsocket(agentData, successCallback, errCallback) {
  try {
    if (!agentData) {
      errorCallback = errCallback;
      return;
    }
    // wsUri = url + '/' + getCookie('openid'); // 这里最好换成一个服务器生成的token,
    // initWebSocket();
    console.log(agentData);
    // console.log(JSON.stringify(agentData));
    messageCallback = successCallback;
    errorCallback = errCallback;
    websocketsend(agentData);
  } catch (e) {
    errorCallback(e);
  }
};

/**
 * 关闭websocket函数
 */
export function closeWebsocket() {
  if (websock) {
    websock.close(); // 关闭websocket
    websock.onclose(); // 关闭websocket
  }
};

/**
 * 开启websocket函数
 *  @param {string} url ws连接地址
 */
export function startWebSocket(url) {
  wsUri = url + '/' + getCookie('openid') + '/' + getCookie('num'); // 这里最好换成一个服务器生成的token
  initWebSocket();
}
